package com.hyt.it.ogt.kq.service.gov.service;

import java.io.IOException;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import com.hyt.it.ogt.kq.service.gov.model.dto.TaskTimeRoomArrangeDTO;
import com.hyt.it.ogt.kq.service.gov.model.entity.TaskPlace;
import com.hyt.it.ogt.kq.service.gov.model.vo.Tree;
import com.hyt.it.ogt.kq.service.gov.model.vo.arrange.ArrangeCount;
import com.hyt.it.ogt.kq.service.gov.model.vo.arrange.ArrangeRoomVO;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hyt.it.ogt.kq.common.config.exception.KqException;
import com.hyt.it.ogt.kq.service.gov.model.entity.TaskRoom;
import com.hyt.it.ogt.kq.service.gov.model.json.examsys.obt.RoomInfoResult;
import com.hyt.it.ogt.kq.service.gov.model.vo.TaskRoomQueryResultVO;
import com.hyt.it.ogt.kq.service.gov.model.vo.TaskRoomTotalVO;
import com.hyt.it.ogt.kq.service.gov.model.vo.TaskTimeRoomArrangeOrNoVO;
import com.hyt.it.ogt.kq.service.gov.model.xml.examsys.gce.RegisterInfoGceResult;
import com.hyt.it.ogt.kq.service.gov.model.xml.examsys.obt.RegisterInfoObtResult;
import com.hyt.loginfo.model.User;

/**
 * <p>
 * 任务考场表 服务类
 * </p>
 *
 * @author huangyh
 * @since 2021-04-12
 */
public interface ITaskRoomService extends IService<TaskRoom> {

    /**
     * 添加编排考点考场
     * @param roomIds 考场id
     * @param officeId 机构id
     * @param taskId 考试任务id
     */
    void addArrangeRoom(String roomIds, String officeId, String taskId);

    /**
     * 查询任务考点考场
     * @param pageParam
     * @param taskId
     * @return
     */
    Page<TaskRoomQueryResultVO> getTaskRoom(Page<TaskRoomQueryResultVO> pageParam, String taskId);

    /**
     * 查询任务考点考场统计
     * @param taskId
     * @return
     */
    TaskRoomTotalVO getTaskRoomTotal(String taskId);

    /**
     * 删除考场
     * @param taskId
     * @param roomIds
     * @throws KqException
     */
    void removeTaskRoom(String taskId,String roomIds) throws KqException;

    /**
     * 通过考场编号获取任务考场
     * @param code 考场编号
     * @return 任务考场
     */
    List<TaskRoom> getByCode(String code);

    /**
     * 根据考试任务编号和考场编号获取任务考场
     * @param taskCode 考试任务编号
     * @param code 考场编号
     * @return 任务考场
     */
    TaskRoom getByTaskCodeAndCode(String taskCode, String code);

    /**
     * 根据考试任务编号和考场编号查询考场是否存在
     * @param taskCode 考试任务编号
     * @param code 考场编号
     * @return true：考场存在，false：考场不存在
     */
    Boolean existByTaskCodeAndCode(String taskCode, String code);

    /**
     * 查询任务下的考场
     * @param taskId
     * @param placeId
     * @return
     */
    List<TaskRoom> getTaskRoom(String taskId,String placeId);

    /**
     * 获取注册考场信息(GCE)
     * @param taskCode 考试任务编号
     * @param code 考场编号
     * @return 注册考场信息
     */
    RegisterInfoGceResult getGceRegisterRoomInfo(String taskCode, String code);

    /**
     * 获取注册考场信息(OBT)
     * @param taskCode 考试任务编号
     * @param code 考场编号
     * @return 注册考场信息
     */
    RegisterInfoObtResult getObtRegisterRoomInfo(String taskCode, String code);

    /**
     * 获取考场信息返回结果
     * @param taskCode 考试任务编号
     * @param placeCode 考点编号
     * @return 考场信息返回结果
     */
    List<RoomInfoResult> getRoomInfoResult(String taskCode, String placeCode);

    /**
     * 根据考试任务编号、考场编号 获取考场机位数
     * @param taskCode 考试任务编号
     * @param roomCode 考场编号
     * @return 考场机位数
     */
    Integer getSeatNumberByCode(String taskCode, String roomCode);

    /**
     * 根据考试任务id获取任务考场数据
     * @param taskId 任务id
     * @return 任务考场数据
     */
    List<TaskRoom> listByTaskId(String taskId);

    /**
     * 根据考试任务id获取任务考场数据
     * @param taskId
     * @return
     */
    Map<String,TaskRoom> mapByTaskId(String taskId);

    /**
     * 下载考场考点导入模板
     *
     * @param response
     * @param user
     * @throws IOException
     * @throws KqException
     */
    void downloadTemplate(HttpServletResponse response, User user) throws IOException, KqException;

    List<TaskTimeRoomArrangeOrNoVO> getRoomArrangeOrNo(TaskTimeRoomArrangeDTO taskTimeRoomArrangeDTO);

    List<List<String>> getDeptData(User user);

    /**
     * 导入考点考场数据
     *
     * @param file
     * @throws IOException
     * @throws KqException
     */
    void importExcel(String fileUrl, String taskId);

    /**
     * 通过考试任务编号、考场编号更新封场状态
     * @param taskCode 考试任务编号
     * @param roomCode 考场编号
     */
    void updateClosureByCode(String taskCode, String roomCode);

    /**
     * 删除任务下所有考场
     * @param taskId 考试任务id
     */
    void deleteAllByTaskId(String taskId);

    /**
     * 获取虚拟考场，并且创建
     * @param taskId
     * @param roomCounts
     * @param timeMaxCandidateCount
     * @return
     */
    List<TaskRoom> getTaskRoomAndCreate(String taskId, Integer roomCounts, Integer timeMaxCandidateCount);

    /**
     * 考试任务下是否存在指定id的考场
     * @param taskId 考试任务id
     * @param roomId 考场id
     * @return true：存在，false：不存在
     */
    boolean hasRoom(String taskId, String roomId);

    Map<String, TaskRoom> getRoomMap(String taskId);

    List<ArrangeRoomVO> getAreaArrangeRoomList(String taskId, String placeProvince);

    void exportExcel(String taskId);

    ArrangeCount countRoom(String taskId);

    /**
     * 查询任务下的考场
     *
     * @param taskId
     * @param taskId
     * @return
     */
    List<String> getTaskRoomByTaskId(String taskId);

    List<TaskPlace> getTaskPlace(String taskId, int arrangeState);

    List<Tree> allTree(String taskId, String type);
}
